﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Util
{
    public class FormularioUtil
    {

        private static FormularioUtil singleton = null;

        private FormularioUtil() { }

        public static FormularioUtil getInstance() {
            if (singleton == null) {
                singleton = new FormularioUtil();
            }

            return singleton;
        }

        public Dictionary<String, String> validarCampos(Control.ControlCollection formulario)
        {
            Dictionary<String, String> campoMensagensErro = null;

            if (formulario != null)
            {
                campoMensagensErro = new Dictionary<String, String>();

                foreach (Control campo in formulario)
                {
                    if (campo is TextBox)
                    {
                        campoMensagensErro = this.validarTextBox(campo, campoMensagensErro);

                        continue;
                    }

                    if (campo is MaskedTextBox)
                    {
                        MaskedTextBox campoComMascara = (MaskedTextBox)campo;

                        if (campoComMascara.Mask.ToString().Equals("9900.00"))
                        {
                            campoMensagensErro = this.validarMaskedInputTextDouble(campo, campoMensagensErro);
                        }
                        else if (campoComMascara.Mask.ToString().Equals("00/00/0000")) 
                        {
                            campoMensagensErro = this.validarTextBox(campoComMascara, campoMensagensErro);
                        }
                        else
                        {
                            campoMensagensErro = this.validarMaskedInputTextInteiro(campo, campoMensagensErro);
                        }

                        continue;
                    }

                    if (campo is ComboBox)
                    {
                        campoMensagensErro = this.validarComboBox(campo, campoMensagensErro);

                        continue;
                    }
                }
            }

            return campoMensagensErro;
        }

        private Dictionary<String, String> validarTextBox(Control campo, Dictionary<String, String> campoMensagemErro)
        {
            if (campo.Name.Equals("txtCodigo")) { 
                return campoMensagemErro;
            }

            if (campo.Text == null || campo.Text.Equals(string.Empty))
            {
                campoMensagemErro.Add(campo.Name.Replace("txt", ""), "é um campo obrigatório");
            }

            return campoMensagemErro;
        }

        private Dictionary<String, String> validarMaskedInputTextDouble(Control campoMascara, Dictionary<String, String> campoMensagemErro)
        {
            if (campoMascara.Text == null || campoMascara.Text.Equals(string.Empty))
            {
                campoMensagemErro.Add(campoMascara.Name.Replace("txt", ""), "é um campo obrigatório!");
            }
            else
            {
                try
                {
                    Double.Parse(campoMascara.Text);
                }
                catch (Exception)
                {
                    campoMensagemErro.Add(campoMascara.Name.Replace("txt", ""), "não é um valor monetário!");
                }
            }

            return campoMensagemErro;
        }

        private Dictionary<String, String> validarMaskedInputTextInteiro(Control campoMascara, Dictionary<String, String> campoMensagemErro)
        {
            if (campoMascara.Name.Equals("txtQtde")) {
                return campoMensagemErro;
            }

            if (campoMascara.Text == null || campoMascara.Text.Equals(string.Empty))
            {
                campoMensagemErro.Add(campoMascara.Name.Replace("txt", ""), "é um campo obrigatório!");
            }
            else
            {
                try
                {
                    Int32.Parse(campoMascara.Text);
                }
                catch (Exception)
                {
                    campoMensagemErro.Add(campoMascara.Name.Replace("txt", ""), "não é um valor inteiro!");
                }
            }

            return campoMensagemErro;
        }

        private Dictionary<String, String> validarComboBox(Control campo, Dictionary<String, String> campoMensagemErro)
        {
            ComboBox comboBox = (ComboBox)campo;

            if (comboBox.Name.Equals("cmbAcao") || comboBox.Name.Equals("cmbProduto")) {
                return campoMensagemErro;
            }

            if (comboBox.SelectedValue == null || comboBox.SelectedValue.ToString().Equals(string.Empty))
            {
                campoMensagemErro.Add(campo.Name.Replace("cmb", ""), "é um campo Obrigatório");
            }

            return campoMensagemErro;
        }

        public bool isDecimal(String numero) {
            decimal valorConvertido = 0;

            return Decimal.TryParse(numero, out valorConvertido);
        }

        public bool isInteiro(String numero) {
            int valorConvertido = 0;

            return int.TryParse(numero, out valorConvertido);
        }

        public bool isDate(String data) {
            IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

            DateTime dataConvertida;

            return DateTime.TryParse(data, culture, System.Globalization.DateTimeStyles.AssumeLocal, out dataConvertida);
        }

        public DateTime convertToDate(String data) {
            IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

            return DateTime.Parse(data, culture, System.Globalization.DateTimeStyles.AssumeLocal);
        }

        public Control.ControlCollection limparCampos(Control.ControlCollection formulario)
        {
            if (formulario != null)
            {
                foreach (Control campo in formulario)
                {
                    if (campo is TextBox || campo is MaskedTextBox)
                    {
                        campo.Text = string.Empty;

                        continue;
                    }

                    if (campo is ComboBox)
                    {
                        ComboBox combo = (ComboBox)campo;

                        if (!combo.Name.Equals("cmbAcao"))
                        {
                            combo.SelectedIndex = -1;
                        }
                        continue;
                    }

                    if (campo is DataGridView) {
                        DataGridView dataGrid = (DataGridView)campo;

                        dataGrid.DataSource = null;

                        continue;
                    }
                }
            }

            return formulario;
        }

        public void removerFormularios(Form[] formulariosFilho) 
        {
            foreach (Form formulario in formulariosFilho)
            {
                formulario.Close();
            }
        }

    }
}
